package org.example.GirdFind;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @ClassName LazyNodePool
 * @Description Node对象池
 * @Author hongjun
 * @Date 2024/5/19 下午6:49
 * @Version 1.0
 */
public class GirdNodePool {
    // 使用线程安全的队列存储可用的节点
    private final Queue<GirdNode> availableNodes = new ConcurrentLinkedQueue<>();
    // 池的最大容量
    private final int maxPoolSize;


    /**
     * 构造函数，初始化节点池
     *
     * @param initialSize
     * @param maxPoolSize
     */
    public GirdNodePool(int initialSize, int maxPoolSize) {
        this.maxPoolSize = maxPoolSize;
        // 初始化节点池，添加指定数量的节点
        for (int i = 0; i < initialSize; i++) {
            availableNodes.add(new GirdNode());
        }
    }

    /**
     * 从池中获取一个节点
     *
     * @return
     */
    public GirdNode acquire(int x, int y, int direction) {
        GirdNode node = availableNodes.poll();
        if (node == null) {
            node = new GirdNode();
        }
        node.setX(x);
        node.setY(y);
        node.setDirection(direction);
        return node;
    }

    /**
     * 释放一个节点回池中
     *
     * @param node
     */
    public boolean release(GirdNode node) {
        if (node == null) {
            throw new IllegalArgumentException("Cannot release null node.");
        }
        if (availableNodes.size() < maxPoolSize) {
            node.reset();
            availableNodes.add(node);
            return true;
        }
        return false;
    }


}
